#include "rom.h"

/* rom 芯片相关特性 */
rom_attr s_rom_attr;

/* --------------------------------------------------------------------- */

/* rom 初始化 */
int rom_init(void)
{

    return -1;
}


/* ***************** 向 mboot的数据存储 提供接口 ***************** */

/* 分配一片空间 */
static hw_addr_attr * rom_op_for_mboot_take_free_space(uint32_t size);
/* 擦除这片空间 */
static HW_STATUS rom_op_for_mboot_erase_space(uint32_t addr);
/* 写数据 */
static int rom_op_for_mboot_put_data(hw_buf_attr * buf_attr, uint32_t addr);
/* 读数据 */
static hw_buf_attr * rom_op_for_mboot_get_data(uint32_t addr, uint16_t nbr);

/* ***************** 提供给mboot的数据存储接口实现 ***************** */
/* 空闲空间地址 */
#define ROM_FREE_BANK_IDX    10                        /*  从第10个Bank开始*/
#define ROM_FREE_ADDR        (ROM_FREE_BANK_IDX * 64 * 1024)  /* 对应地址 */
#define ROM_FREE_MAX_SIZE    (2 * 1024 * 1024)         /* 最大允许分配的空间 */

/* 空闲地址信息 */
hw_addr_attr rom_free_addr;

/* 保存数据的buf */
uint8_t rom_rd_buf[256], rom_wr_buf[256];
hw_buf_attr rom_write_buf = 
{
    .buf = rom_wr_buf,
    .len = 256,
};

hw_buf_attr rom_read_buf = 
{
    .buf = rom_rd_buf,
    .len = 256,
};

/* rom提供给 mboot的操作函数 */
rom_op_for_mboot s_rom_op_for_mboot = 
{
    .take_free_space  = rom_op_for_mboot_take_free_space,
    .erase_space      = rom_op_for_mboot_erase_space,
    .put_data         = rom_op_for_mboot_put_data,
    .get_data         = rom_op_for_mboot_get_data,
    .memory_mapped    = NULL,
};

/* 分配一片空间 */
static hw_addr_attr * rom_op_for_mboot_take_free_space(uint32_t size)
{
    int pnbr;

    /* 空间起始地址 */
    rom_free_addr.addr = ROM_FREE_ADDR;  /* 空闲空间的起始地址 */

    /* 按整数扇区分配 */
    pnbr = (size / s_rom_attr.sector_size);

    if ((size % s_rom_attr.sector_size))
    {
        pnbr++;
    }

    /* 空闲空间长度 */
    rom_free_addr.len  = (pnbr * s_rom_attr.sector_size);

    return &rom_free_addr;
}

/* 擦除这片空间 */
static HW_STATUS rom_op_for_mboot_erase_space(uint32_t addr)
{
    int      i, snbr;

//    uint32_t eaddr = addr;

    /* 计算总扇区个数 */
    snbr = rom_free_addr.len / s_rom_attr.sector_size;

    /* 擦除这些扇区 */
    for (i = 0; i < snbr; i++)
    {
//        rom_sector_erase(addr);
        addr += (s_rom_attr.sector_size * i);
    }

    return HW_TRUE;
}

/* 写数据 */
static int rom_op_for_mboot_put_data(hw_buf_attr * buf_attr, uint32_t addr)
{
//    uint16_t size;

    memset(rom_write_buf.buf, 0, rom_write_buf.len);
    memcpy(rom_write_buf.buf, buf_attr->buf, buf_attr->len);

    /* 按页写入数据 */
//    rom_page_write(rom_write_buf.buf, addr, rom_write_buf.len);

    return 0;
}

/* 读数据 */
static hw_buf_attr * rom_op_for_mboot_get_data(uint32_t addr, uint16_t nbr)
{
    /* 清空 */
    memset(rom_read_buf.buf, 0, rom_read_buf.len);

    /* 按页读出数据 */
//    rom_page_read(rom_read_buf.buf, addr, rom_read_buf.len);

    return &rom_read_buf;
}

/* ***************** 向 mboot的数据存储 提供接口和接收配置信息 ***************** */

rom_op_for_mboot *rom_op_for_mboot_register(void)
{
    /* 返回操作函数接口 */
//    return &s_rom_op_for_mboot;
    return NULL; /* 暂不支持ROM */
}
